// 给定一个字符串s，请在 s 中找出第一个只出现一次的字符。
// 如果没有，返回一个单空格； s 只包含小写字母。

var firstUniqChar: (s: string) => string = function (s) {
    // 哈希表声明
    const hashMap = new Map<string, boolean>();
    // 遍历原字符串完成哈希表记录
    for (let str of s) {
        // 值得学习的优化部分，巧妙节省空间并提升速率的写法
        hashMap.set(str, !hashMap.has(str));
    }
    // 遍历哈希表，返回对应结果
    for (let keyValue of hashMap.entries()) {
        if (keyValue[1] === true) {
            return keyValue[0]
        }
    }
    return " ";
};

console.log(firstUniqChar('leetcode'));

        // 这道题很简单了，就是考察一个哈希表的使用，只要能想到哈希表我认为基本没难度
        // 用哈希表记录原字符串单字符的情况，然后直接再遍历哈希表返回对应的结果即可
        // 值得一提的是这里有一个优化技巧，因为题目的要求是找到第一个字符
        // 那么实际上哈希表的字符只有两类：1、出现一次的字符。2、出现多次的字符。
        // 所以从节省空间和提升算法速度的角度出发，其实我们不需要用哈希表计数和if语句判断
        // 即计数结果可以直接用布尔值来表示出现一次的字符（true）和多次的字符（false）